// 对webpack进行增量配置
// 修改此处文件后一定要重启当前项目

const { resolve } = require('path')
const { defineConfig } = require('@vue/cli-service')
const CompressionPlugin = require('compression-webpack-plugin')

// 定义一个promise的延时器
const delay = (ms = 300) => {
  return new Promise(resolve => {
    setTimeout(resolve, ms)
  })
}

module.exports = defineConfig({
  transpileDependencies: true,

  // 对node_modules目录中的库文件打包时进行优化配置
  configureWebpack: {
    // source-map 关闭，关闭好处打包后的文件小，而且安全
    devtool: false,
    performance: {
      // 修改入口的文件大小，它默认为500kb
      maxEntrypointSize: 10000000
    },
    // 忽略打包  打包时进行cdn优化
    externals: {
      // key它是打包后在window对象中的属性
      // value 它是 import 导入时它的名称
      // axios: 'axios',
      // dayjs: 'dayjs',
      // lodash: 'lodash',
      // 'element-ui': 'ElementUI'
    },
    plugins: [
      // 压缩 -- gzip压缩  压缩后的代码在上线时，需要nginx对应的要配置一下才能使用
      // new CompressionPlugin({
      //   // 压缩算法  gzip 现在所有的浏览器都是支持的
      //   algorithm: 'gzip',
      //   test: /\.(js|css|json|txt)(\?.*)?$/i,
      //   // threshold: 10240,
      //   threshold: 100,
      //   // 压缩比
      //   minRatio: 0.7,
      //   // 是否删除原始文件
      //   deleteOriginalAssets: true
      // })
    ]
  },
  chainWebpack(config) {
    config.optimization.splitChunks({
      chunks: 'all', // all async initial
      cacheGroups: {
        libs: {
          name: 'chunk-libs',
          test: /[\\/]node_modules[\\/]/,
          priority: 10,
          chunks: 'initial' // only package third parties that are initially dependent
        },
        elementUI: {
          name: 'chunk-elementUI', // split elementUI into a single package
          priority: 20,
          test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
        },
        xlsx: {
          name: 'chunk-xlsx', // split elementUI into a single package
          priority: 19,
          test: /[\\/]node_modules[\\/]_?xlsx(.*)/ // in order to adapt to cnpm
        },
        commons: {
          name: 'chunk-commons',
          test: resolve('src/components'), // can customize your rules
          minChunks: 3, //  minimum common number
          priority: 5,
          reuseExistingChunk: true
        }
      }
    })
  },

  // 对开发时服务器进行增量配置
  devServer: {
    // 中间件，利用此中间件，完成mock数据生成
    setupMiddlewares: (middlewares, { app }) => {
      return middlewares
    }
    // 代理，用于在开发阶段进行跨域解决方案
    // 模糊匹配 /api /api1 /api2
    // proxy: {
    //   // 请求地址如果想要被代理，则一定不能有请求的域名
    //   '/api': {
    //     // https://xx/api/v2/getNowPlay
    //     target: 'https://api.iynn.cn/film',
    //     // 修改请求的host主机为目标地址
    //     changeOrigin: true
    //     // url重写
    //     // /aa/api/xxxx => 把请求url地址以/aa开头的字符串给替换为空
    //     // pathRewrite: { '^/aa': '' }
    //   },
    //   '/maizuo': {
    //     target: 'https://m.maizuo.com',
    //     changeOrigin: true,
    //     pathRewrite: { '^/maizuo': '' }
    //   }
    // }
  }
})
